package com.allen.imsystem;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

/**
 * @ClassName MyBatisPlusGenerator
 * @Description
 * @Version 1.0
 */
// 演示例子，执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class MyBatisPlusGenerator {

    public static void main(String[] args) {
//        generate(IdType.AUTO, "user", "user_info","friend",
//                "friend_apply", "friend_group", "apply_notify", "file_md5");
//        generate(IdType.NONE, "group_chat", "private_chat", "pri_msg_record", "group_msg_record");
        generate(IdType.NONE, "group");
    }

    static void generate(IdType idType, String... tables){
        // 0 创建代码生成器对象
        AutoGenerator generator = new AutoGenerator();

        // 1 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java/generate"); // 生成的根目录
        gc.setFileOverride(false);              // 是否覆盖已有文件
        gc.setEnableCache(true);                // 是否在xml中添加二级缓存配置
        gc.setIdType(idType);                   // 主键生成策略
        gc.setAuthor("XianChuLun");             // 作者名
        gc.setSwagger2(true);                   // 是否生成swagger2的注解
        gc.setBaseResultMap(true);              // 是否生成BaseResultMap
        gc.setBaseColumnList(true);             // 是否生成BaseColumnList
        // 设置生成的文件后缀，%s代表实体类名
        gc.setMapperName("%sMapper");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setControllerName("%sController");
        generator.setGlobalConfig(gc);

        // 2 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://121.199.10.4:3306/emm_im?useUnicode=true&allowMultiQueries=true");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        generator.setDataSource(dsc);

        // 3 包配置
        PackageConfig pc = new PackageConfig();
//        pc.setParent("com.allen.imsystem");
        pc.setModuleName("talkapp");
        pc.setEntity("pojo");
        pc.setMapper("mappers");
        pc.setService("service");
        pc.setController("controller");
        generator.setPackageInfo(pc);

        // 4 策略配置
        StrategyConfig sc = new StrategyConfig();
        sc.setInclude(tables); // 要生成的表
        sc.setNaming(NamingStrategy.underline_to_camel);    // 命名风格：下划线转驼峰
        sc.setColumnNaming(NamingStrategy.underline_to_camel);
        sc.setEntityLombokModel(true);  // 启用Lombok插件
        sc.setRestControllerStyle(true);
        // 自动填充策略
        TableFill createdTime = new TableFill("created_time", FieldFill.INSERT);
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(createdTime);
        tableFills.add(updateTime);
        sc.setTableFillList(tableFills);

        generator.setStrategy(sc);
        generator.execute();
    }

}
